{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "V100"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# Training a Simple GAN with PyTorch\n",
        "- GAN for Generating simple MNIST Images\n",
        "- Good to have a GPU for faster training"
      ],
      "metadata": {
        "id": "r2dfGLNrTmHv"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "4YxqP7LbiUrv"
      },
      "outputs": [],
      "source": [
        "# Torch Imports\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.optim as optim\n",
        "import torch.nn.functional as F\n",
        "\n",
        "# Torchvision Imports\n",
        "from torchvision import datasets, transforms\n",
        "from torchvision.utils import save_image\n",
        "\n",
        "# Device configuration; Good to have a GPU for GAN Training\n",
        "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "device"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "K5f7nyCDieqA",
        "outputId": "3b24d06e-f257-4952-9275-58535b9fa06f"
      },
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "device(type='cuda')"
            ]
          },
          "metadata": {},
          "execution_count": 2
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Generator Network\n",
        "- 4 Fully Connected Layers\n",
        "- Output Dimension will be same as 28*28"
      ],
      "metadata": {
        "id": "SbdcNZOHTUgM"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "class Generator(nn.Module):\n",
        "    def __init__(self, g_input_dim, g_output_dim):\n",
        "        super(Generator, self).__init__()\n",
        "        self.fc1 = nn.Linear(g_input_dim, 256)\n",
        "        self.fc2 = nn.Linear(256, 512)\n",
        "        self.fc3 = nn.Linear(512, 1024)\n",
        "        self.fc4 = nn.Linear(1024, g_output_dim)\n",
        "\n",
        "\n",
        "    # forward method\n",
        "    def forward(self, x):\n",
        "        x = F.leaky_relu(self.fc1(x), negative_slope=0.2)\n",
        "        x = F.leaky_relu(self.fc2(x), negative_slope=0.2)\n",
        "        x = F.leaky_relu(self.fc3(x), negative_slope=0.2)\n",
        "        return torch.tanh(self.fc4(x))\n"
      ],
      "metadata": {
        "id": "lYTu38GFik4Z"
      },
      "execution_count": 16,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Discriminator Network\n",
        "- 4 Fully Connected Layers\n",
        "- Output is a Single Neuron, 1=Real Image, 0=Fake Image"
      ],
      "metadata": {
        "id": "G-JIxeU0TcyI"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "class Discriminator(nn.Module):\n",
        "    def __init__(self, d_input_dim):\n",
        "        super(Discriminator, self).__init__()\n",
        "        self.fc1 = nn.Linear(d_input_dim, 1024)\n",
        "        self.fc2 = nn.Linear(1024, 512)\n",
        "        self.fc3 = nn.Linear(512, 256)\n",
        "        self.fc4 = nn.Linear(256, 1)\n",
        "\n",
        "    # forward method\n",
        "    def forward(self, x):\n",
        "        x = F.leaky_relu(self.fc1(x), negative_slope=0.2)\n",
        "        x = F.dropout(x, p=0.3)\n",
        "        x = F.leaky_relu(self.fc2(x), negative_slope=0.2)\n",
        "        x = F.dropout(x, p=0.3)\n",
        "        x = F.leaky_relu(self.fc3(x), negative_slope=0.2)\n",
        "        x = F.dropout(x, p=0.3)\n",
        "        return torch.sigmoid(self.fc4(x))\n"
      ],
      "metadata": {
        "id": "Is-ZNi1tio-_"
      },
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Instantiating Models\n",
        "- Using a random noise of 100 dimensions\n",
        "- Using BCE Loss for Training\n",
        "- Using Adam Optimizer for Training"
      ],
      "metadata": {
        "id": "nvYTEfyMTJKV"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Models\n",
        "z_dim = 100 # Dimension of the Input Noise to the Generator\n",
        "mnist_dim = 28 * 28 # As we have 28x28 pixel images in MNIST\n",
        "G = Generator(g_input_dim = z_dim, g_output_dim = mnist_dim).to(device)\n",
        "D = Discriminator(mnist_dim).to(device)\n",
        "\n",
        "# loss\n",
        "criterion = nn.BCELoss()\n",
        "\n",
        "# optimizer\n",
        "lr = 0.0002\n",
        "G_optimizer = optim.Adam(G.parameters(), lr = lr)\n",
        "D_optimizer = optim.Adam(D.parameters(), lr = lr)"
      ],
      "metadata": {
        "id": "RWhtpwPvi1Gw"
      },
      "execution_count": 32,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Loading & Normalizing MNIST Dataset"
      ],
      "metadata": {
        "id": "MQD5--pkTCwi"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Batch Size for Training\n",
        "batch_size = 100\n",
        "\n",
        "# Transforming Images to Tensor and then Normalizing the values to be between 0 and 1, with mean 0.5 and std 0.5\n",
        "transform = transforms.Compose([\n",
        "    transforms.ToTensor(),\n",
        "    transforms.Normalize(mean=(0.5,), std=(0.5,))])\n",
        "\n",
        "# Loading the Training Dataset and applying Transformation\n",
        "train_dataset = datasets.MNIST(root='./mnist/', train=True, transform=transform, download=True)\n",
        "test_dataset = datasets.MNIST(root='./mnist/', train=False, transform=transform, download=False)\n",
        "\n",
        "# Data Loader which will be used as input to the models.\n",
        "train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)\n",
        "test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)\n"
      ],
      "metadata": {
        "id": "Mi4nn196i4bi"
      },
      "execution_count": 33,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Method for Training Discriminator"
      ],
      "metadata": {
        "id": "uG5014WuTANh"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def train_discriminator(mnist_data_batch):\n",
        "    #===================Discriminator-Trainer===================#\n",
        "    D.zero_grad()\n",
        "\n",
        "    # train discriminator on real\n",
        "    x_real, y_real = mnist_data_batch.view(-1, mnist_dim), torch.ones(batch_size, 1)\n",
        "    x_real, y_real = x_real.to(device), y_real.to(device)\n",
        "\n",
        "    # Loss for Real MNIST Data\n",
        "    D_output = D(x_real)\n",
        "    D_real_loss = criterion(D_output, y_real)\n",
        "\n",
        "    # Generate Data from Generator Network for Training\n",
        "    z = torch.randn(batch_size, z_dim).to(device) # Random Noise as Input to G\n",
        "    x_fake, y_fake = G(z), torch.zeros(batch_size, 1).to(device)\n",
        "\n",
        "    # Loss for Fake Data from Generator\n",
        "    D_output = D(x_fake)\n",
        "    D_fake_loss = criterion(D_output, y_fake)\n",
        "\n",
        "    # Updating only D's weights, so training on D on total loss\n",
        "    D_loss = D_real_loss + D_fake_loss\n",
        "    D_loss.backward()\n",
        "    D_optimizer.step()\n",
        "\n",
        "    return  D_loss.data.item()\n"
      ],
      "metadata": {
        "id": "RZkoCFbQi8Et"
      },
      "execution_count": 34,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Method for Training Generator"
      ],
      "metadata": {
        "id": "svYCG8BRS8Go"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def train_generator():\n",
        "    #=======================Generator-Trainer=======================#\n",
        "    G.zero_grad()\n",
        "\n",
        "    # Generate Random Noise to use as Input to the Generator\n",
        "    z = torch.randn(batch_size, z_dim).to(device)\n",
        "    # The final label in this case in 1(True), i.e the Discriminator Model\n",
        "    # Thinks these are real images therefore the losses for Generator\n",
        "    # Network should update the weights of G in such a way that it produces more\n",
        "    # Real looking images.\n",
        "    y = torch.ones(batch_size, 1).to(device)\n",
        "\n",
        "    # Generate Images\n",
        "    G_output = G(z)\n",
        "    # Get output from Discriminator for the Generated Images\n",
        "    D_output = D(G_output)\n",
        "    # Compute Loss\n",
        "    G_loss = criterion(D_output, y)\n",
        "\n",
        "    # Updating only G's weights\n",
        "    G_loss.backward()\n",
        "    G_optimizer.step()\n",
        "\n",
        "    return G_loss.data.item()"
      ],
      "metadata": {
        "id": "5_ZOsm6zjAj5"
      },
      "execution_count": 36,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Main Training Loop"
      ],
      "metadata": {
        "id": "M0zmaw4MS6bP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# Total number of epochs for Training\n",
        "n_epoch = 200\n",
        "\n",
        "losses = []\n",
        "\n",
        "for epoch in range(n_epoch):\n",
        "    D_losses, G_losses = [], []\n",
        "    # For Every Batch in the MNIST dataset\n",
        "    # We train the Discriminator First, then the Generator\n",
        "    for batch_idx, (mnist_input_data, _) in enumerate(train_loader):\n",
        "        D_losses.append(train_discriminator(mnist_input_data))\n",
        "        G_losses.append(train_generator())\n",
        "\n",
        "    if epoch % 20 == 0:\n",
        "        test_z = torch.randn(8, z_dim).to(device)\n",
        "        generated = G(test_z)\n",
        "        save_image(generated.view(generated.size(0), 1, 28, 28), f'./track/sample_images_{epoch}' + '.png')\n",
        "\n",
        "    # Logging the Loss values from Discriminator and Generator\n",
        "    loss_d = torch.mean(torch.FloatTensor(D_losses))\n",
        "    loss_g = torch.mean(torch.FloatTensor(G_losses))\n",
        "    losses.append((loss_d, loss_g))\n",
        "    print(f'[{epoch}/{n_epoch}]: loss_d: {loss_d}, loss_g: {loss_g}')"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "BNEl9XfflU21",
        "outputId": "e038415d-69a0-4c71-a96b-2c0a3a1435d6"
      },
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[0/200]: loss_d: 0.9146503806114197, loss_g: 3.433616876602173\n",
            "[1/200]: loss_d: 0.8558991551399231, loss_g: 2.061593770980835\n",
            "[2/200]: loss_d: 0.6198763847351074, loss_g: 2.513192653656006\n",
            "[3/200]: loss_d: 0.3702886402606964, loss_g: 3.6631579399108887\n",
            "[4/200]: loss_d: 0.5312609672546387, loss_g: 2.9285387992858887\n",
            "[5/200]: loss_d: 0.5179638862609863, loss_g: 2.810464382171631\n",
            "[6/200]: loss_d: 0.5118756294250488, loss_g: 2.9796879291534424\n",
            "[7/200]: loss_d: 0.5017836689949036, loss_g: 2.8963441848754883\n",
            "[8/200]: loss_d: 0.5901499390602112, loss_g: 2.594468593597412\n",
            "[9/200]: loss_d: 0.6117517352104187, loss_g: 2.4745798110961914\n",
            "[10/200]: loss_d: 0.6969274282455444, loss_g: 2.2004780769348145\n",
            "[11/200]: loss_d: 0.6853969097137451, loss_g: 2.2216601371765137\n",
            "[12/200]: loss_d: 0.7037848830223083, loss_g: 2.2637710571289062\n",
            "[13/200]: loss_d: 0.7232202887535095, loss_g: 2.162294626235962\n",
            "[14/200]: loss_d: 0.7595869898796082, loss_g: 2.0215725898742676\n",
            "[15/200]: loss_d: 0.7712383270263672, loss_g: 1.9766045808792114\n",
            "[16/200]: loss_d: 0.8085837960243225, loss_g: 1.85626220703125\n",
            "[17/200]: loss_d: 0.837213397026062, loss_g: 1.8099002838134766\n",
            "[18/200]: loss_d: 0.8904352784156799, loss_g: 1.7036441564559937\n",
            "[19/200]: loss_d: 0.8592150807380676, loss_g: 1.7528222799301147\n",
            "[20/200]: loss_d: 0.8987336158752441, loss_g: 1.6452113389968872\n",
            "[21/200]: loss_d: 0.8998264670372009, loss_g: 1.6009377241134644\n",
            "[22/200]: loss_d: 0.9233296513557434, loss_g: 1.5625874996185303\n",
            "[23/200]: loss_d: 0.9197718501091003, loss_g: 1.5865978002548218\n",
            "[24/200]: loss_d: 0.9444578886032104, loss_g: 1.5404311418533325\n",
            "[25/200]: loss_d: 0.9654837250709534, loss_g: 1.5033046007156372\n",
            "[26/200]: loss_d: 0.9553127884864807, loss_g: 1.5127971172332764\n",
            "[27/200]: loss_d: 0.9702818989753723, loss_g: 1.4781250953674316\n",
            "[28/200]: loss_d: 1.0083098411560059, loss_g: 1.3991708755493164\n",
            "[29/200]: loss_d: 1.0244539976119995, loss_g: 1.3516300916671753\n",
            "[30/200]: loss_d: 1.0293200016021729, loss_g: 1.3389872312545776\n",
            "[31/200]: loss_d: 1.042341947555542, loss_g: 1.3259069919586182\n",
            "[32/200]: loss_d: 1.045912504196167, loss_g: 1.3174084424972534\n",
            "[33/200]: loss_d: 1.0737347602844238, loss_g: 1.257028579711914\n",
            "[34/200]: loss_d: 1.0486377477645874, loss_g: 1.3140242099761963\n",
            "[35/200]: loss_d: 1.0672743320465088, loss_g: 1.2811315059661865\n",
            "[36/200]: loss_d: 1.0761812925338745, loss_g: 1.2534252405166626\n",
            "[37/200]: loss_d: 1.0945074558258057, loss_g: 1.2057721614837646\n",
            "[38/200]: loss_d: 1.1129403114318848, loss_g: 1.1947318315505981\n",
            "[39/200]: loss_d: 1.1006089448928833, loss_g: 1.199571132659912\n",
            "[40/200]: loss_d: 1.099735140800476, loss_g: 1.2176586389541626\n",
            "[41/200]: loss_d: 1.1093521118164062, loss_g: 1.1890313625335693\n",
            "[42/200]: loss_d: 1.1368016004562378, loss_g: 1.1294952630996704\n",
            "[43/200]: loss_d: 1.1460973024368286, loss_g: 1.1140971183776855\n",
            "[44/200]: loss_d: 1.166749119758606, loss_g: 1.073487401008606\n",
            "[45/200]: loss_d: 1.1564363241195679, loss_g: 1.104121446609497\n",
            "[46/200]: loss_d: 1.1541786193847656, loss_g: 1.1044166088104248\n",
            "[47/200]: loss_d: 1.1686615943908691, loss_g: 1.0766044855117798\n",
            "[48/200]: loss_d: 1.1527529954910278, loss_g: 1.0990266799926758\n",
            "[49/200]: loss_d: 1.1785969734191895, loss_g: 1.0749015808105469\n",
            "[50/200]: loss_d: 1.1780593395233154, loss_g: 1.0537337064743042\n",
            "[51/200]: loss_d: 1.1735259294509888, loss_g: 1.0590922832489014\n",
            "[52/200]: loss_d: 1.1849842071533203, loss_g: 1.0456005334854126\n",
            "[53/200]: loss_d: 1.1849759817123413, loss_g: 1.0428775548934937\n",
            "[54/200]: loss_d: 1.1675015687942505, loss_g: 1.0833818912506104\n",
            "[55/200]: loss_d: 1.1736633777618408, loss_g: 1.0591089725494385\n",
            "[56/200]: loss_d: 1.1869820356369019, loss_g: 1.045609951019287\n",
            "[57/200]: loss_d: 1.1733564138412476, loss_g: 1.0598241090774536\n",
            "[58/200]: loss_d: 1.197429895401001, loss_g: 1.029147982597351\n",
            "[59/200]: loss_d: 1.1941872835159302, loss_g: 1.0345375537872314\n",
            "[60/200]: loss_d: 1.2007296085357666, loss_g: 1.009073257446289\n",
            "[61/200]: loss_d: 1.2085444927215576, loss_g: 1.0041333436965942\n",
            "[62/200]: loss_d: 1.2089660167694092, loss_g: 1.0030670166015625\n",
            "[63/200]: loss_d: 1.2084110975265503, loss_g: 1.0064218044281006\n",
            "[64/200]: loss_d: 1.208119511604309, loss_g: 1.0273746252059937\n",
            "[65/200]: loss_d: 1.1960703134536743, loss_g: 1.0079784393310547\n",
            "[66/200]: loss_d: 1.209489345550537, loss_g: 0.9980199337005615\n",
            "[67/200]: loss_d: 1.2162903547286987, loss_g: 0.9909312725067139\n",
            "[68/200]: loss_d: 1.2184358835220337, loss_g: 0.9867106080055237\n",
            "[69/200]: loss_d: 1.205161452293396, loss_g: 1.0126489400863647\n",
            "[70/200]: loss_d: 1.2081446647644043, loss_g: 0.9998278617858887\n",
            "[71/200]: loss_d: 1.2215524911880493, loss_g: 0.9867916107177734\n",
            "[72/200]: loss_d: 1.2182668447494507, loss_g: 0.9845251441001892\n",
            "[73/200]: loss_d: 1.2204670906066895, loss_g: 0.971818745136261\n",
            "[74/200]: loss_d: 1.2243229150772095, loss_g: 0.9719354510307312\n",
            "[75/200]: loss_d: 1.2317386865615845, loss_g: 0.9599524140357971\n",
            "[76/200]: loss_d: 1.232664942741394, loss_g: 0.9698901176452637\n",
            "[77/200]: loss_d: 1.2287476062774658, loss_g: 0.9674580097198486\n",
            "[78/200]: loss_d: 1.2301369905471802, loss_g: 0.9663421511650085\n",
            "[79/200]: loss_d: 1.2312263250350952, loss_g: 0.9693248271942139\n",
            "[80/200]: loss_d: 1.2264090776443481, loss_g: 0.968766450881958\n",
            "[81/200]: loss_d: 1.2420271635055542, loss_g: 0.9429576396942139\n",
            "[82/200]: loss_d: 1.2492294311523438, loss_g: 0.9432737231254578\n",
            "[83/200]: loss_d: 1.2386616468429565, loss_g: 0.9605010151863098\n",
            "[84/200]: loss_d: 1.246367335319519, loss_g: 0.9408555030822754\n",
            "[85/200]: loss_d: 1.245644450187683, loss_g: 0.9317128658294678\n",
            "[86/200]: loss_d: 1.2479668855667114, loss_g: 0.9381725788116455\n",
            "[87/200]: loss_d: 1.2530035972595215, loss_g: 0.9324666261672974\n",
            "[88/200]: loss_d: 1.2515255212783813, loss_g: 0.9271997809410095\n",
            "[89/200]: loss_d: 1.2518559694290161, loss_g: 0.9328320026397705\n",
            "[90/200]: loss_d: 1.2611608505249023, loss_g: 0.9260624051094055\n",
            "[91/200]: loss_d: 1.2395923137664795, loss_g: 0.9516741037368774\n",
            "[92/200]: loss_d: 1.24110746383667, loss_g: 0.9470189213752747\n",
            "[93/200]: loss_d: 1.2569069862365723, loss_g: 0.9240012764930725\n",
            "[94/200]: loss_d: 1.2609883546829224, loss_g: 0.9159812331199646\n",
            "[95/200]: loss_d: 1.2582902908325195, loss_g: 0.9302670359611511\n",
            "[96/200]: loss_d: 1.260454535484314, loss_g: 0.9174045920372009\n",
            "[97/200]: loss_d: 1.2542364597320557, loss_g: 0.9428840279579163\n",
            "[98/200]: loss_d: 1.2495557069778442, loss_g: 0.9368179440498352\n",
            "[99/200]: loss_d: 1.2558437585830688, loss_g: 0.9258015751838684\n",
            "[100/200]: loss_d: 1.2525439262390137, loss_g: 0.9339278340339661\n",
            "[101/200]: loss_d: 1.2602195739746094, loss_g: 0.9154782295227051\n",
            "[102/200]: loss_d: 1.255793571472168, loss_g: 0.931077778339386\n",
            "[103/200]: loss_d: 1.2618385553359985, loss_g: 0.9159396290779114\n",
            "[104/200]: loss_d: 1.2630549669265747, loss_g: 0.9149219989776611\n",
            "[105/200]: loss_d: 1.2624537944793701, loss_g: 0.9179642796516418\n",
            "[106/200]: loss_d: 1.267775297164917, loss_g: 0.8985586762428284\n",
            "[107/200]: loss_d: 1.2645678520202637, loss_g: 0.9283223748207092\n",
            "[108/200]: loss_d: 1.2610085010528564, loss_g: 0.9226682782173157\n",
            "[109/200]: loss_d: 1.2663140296936035, loss_g: 0.9063569903373718\n",
            "[110/200]: loss_d: 1.273630142211914, loss_g: 0.8979144096374512\n",
            "[111/200]: loss_d: 1.2664659023284912, loss_g: 0.9054463505744934\n",
            "[112/200]: loss_d: 1.2718747854232788, loss_g: 0.9133636355400085\n",
            "[113/200]: loss_d: 1.2676904201507568, loss_g: 0.9077649116516113\n",
            "[114/200]: loss_d: 1.2680515050888062, loss_g: 0.9117048382759094\n",
            "[115/200]: loss_d: 1.2681797742843628, loss_g: 0.9100083708763123\n",
            "[116/200]: loss_d: 1.270310401916504, loss_g: 0.9009278416633606\n",
            "[117/200]: loss_d: 1.2613310813903809, loss_g: 0.9169690012931824\n",
            "[118/200]: loss_d: 1.2698557376861572, loss_g: 0.8982791900634766\n",
            "[119/200]: loss_d: 1.2698291540145874, loss_g: 0.9035687446594238\n",
            "[120/200]: loss_d: 1.2703474760055542, loss_g: 0.8984969258308411\n",
            "[121/200]: loss_d: 1.2742611169815063, loss_g: 0.8962373733520508\n",
            "[122/200]: loss_d: 1.2671364545822144, loss_g: 0.9069970846176147\n",
            "[123/200]: loss_d: 1.269374132156372, loss_g: 0.9010677933692932\n",
            "[124/200]: loss_d: 1.271445631980896, loss_g: 0.897096574306488\n",
            "[125/200]: loss_d: 1.2649344205856323, loss_g: 0.9063721895217896\n",
            "[126/200]: loss_d: 1.2720450162887573, loss_g: 0.895263671875\n",
            "[127/200]: loss_d: 1.2697710990905762, loss_g: 0.9099048972129822\n",
            "[128/200]: loss_d: 1.276951789855957, loss_g: 0.8932313919067383\n",
            "[129/200]: loss_d: 1.266547441482544, loss_g: 0.9111641645431519\n",
            "[130/200]: loss_d: 1.2685573101043701, loss_g: 0.902113676071167\n",
            "[131/200]: loss_d: 1.2718244791030884, loss_g: 0.9004645943641663\n",
            "[132/200]: loss_d: 1.2733635902404785, loss_g: 0.8937777876853943\n",
            "[133/200]: loss_d: 1.2761744260787964, loss_g: 0.8874789476394653\n",
            "[134/200]: loss_d: 1.2761343717575073, loss_g: 0.8905723094940186\n",
            "[135/200]: loss_d: 1.276907205581665, loss_g: 0.9010087847709656\n",
            "[136/200]: loss_d: 1.2701665163040161, loss_g: 0.9036233425140381\n",
            "[137/200]: loss_d: 1.2736124992370605, loss_g: 0.8909435868263245\n",
            "[138/200]: loss_d: 1.2725528478622437, loss_g: 0.8932768702507019\n",
            "[139/200]: loss_d: 1.2821820974349976, loss_g: 0.8821983933448792\n",
            "[140/200]: loss_d: 1.274263858795166, loss_g: 0.8968163132667542\n",
            "[141/200]: loss_d: 1.2813081741333008, loss_g: 0.8839878439903259\n",
            "[142/200]: loss_d: 1.276004672050476, loss_g: 0.8986204266548157\n",
            "[143/200]: loss_d: 1.274269938468933, loss_g: 0.8952640891075134\n",
            "[144/200]: loss_d: 1.2697181701660156, loss_g: 0.9054497480392456\n",
            "[145/200]: loss_d: 1.2776007652282715, loss_g: 0.8857342600822449\n",
            "[146/200]: loss_d: 1.2696534395217896, loss_g: 0.9099660515785217\n",
            "[147/200]: loss_d: 1.2767419815063477, loss_g: 0.888558030128479\n",
            "[148/200]: loss_d: 1.2743117809295654, loss_g: 0.8906671404838562\n",
            "[149/200]: loss_d: 1.2746714353561401, loss_g: 0.8976309299468994\n",
            "[150/200]: loss_d: 1.2799885272979736, loss_g: 0.8783807158470154\n",
            "[151/200]: loss_d: 1.2887035608291626, loss_g: 0.8788133859634399\n",
            "[152/200]: loss_d: 1.2723112106323242, loss_g: 0.903651237487793\n",
            "[153/200]: loss_d: 1.2760266065597534, loss_g: 0.8942862153053284\n",
            "[154/200]: loss_d: 1.281453013420105, loss_g: 0.8809673190116882\n",
            "[155/200]: loss_d: 1.2781094312667847, loss_g: 0.8911910057067871\n",
            "[156/200]: loss_d: 1.283931851387024, loss_g: 0.8798708319664001\n",
            "[157/200]: loss_d: 1.2800960540771484, loss_g: 0.8877331614494324\n",
            "[158/200]: loss_d: 1.2817497253417969, loss_g: 0.8840455412864685\n",
            "[159/200]: loss_d: 1.280759334564209, loss_g: 0.8850587010383606\n",
            "[160/200]: loss_d: 1.2861912250518799, loss_g: 0.8740025758743286\n",
            "[161/200]: loss_d: 1.2838289737701416, loss_g: 0.8798909783363342\n",
            "[162/200]: loss_d: 1.2833906412124634, loss_g: 0.8743131756782532\n",
            "[163/200]: loss_d: 1.2824714183807373, loss_g: 0.8813195824623108\n",
            "[164/200]: loss_d: 1.2806756496429443, loss_g: 0.8829853534698486\n",
            "[165/200]: loss_d: 1.2853825092315674, loss_g: 0.8746076226234436\n",
            "[166/200]: loss_d: 1.2871708869934082, loss_g: 0.8835866451263428\n",
            "[167/200]: loss_d: 1.2853295803070068, loss_g: 0.8785573244094849\n",
            "[168/200]: loss_d: 1.2804043292999268, loss_g: 0.8843532204627991\n",
            "[169/200]: loss_d: 1.2818779945373535, loss_g: 0.8878957033157349\n",
            "[170/200]: loss_d: 1.2885345220565796, loss_g: 0.878399133682251\n",
            "[171/200]: loss_d: 1.282859444618225, loss_g: 0.8747975826263428\n",
            "[172/200]: loss_d: 1.283128261566162, loss_g: 0.8761637210845947\n",
            "[173/200]: loss_d: 1.2856146097183228, loss_g: 0.8824350833892822\n",
            "[174/200]: loss_d: 1.2828478813171387, loss_g: 0.884412407875061\n",
            "[175/200]: loss_d: 1.2895102500915527, loss_g: 0.8740105032920837\n",
            "[176/200]: loss_d: 1.2806307077407837, loss_g: 0.8810219168663025\n",
            "[177/200]: loss_d: 1.291514277458191, loss_g: 0.8663840889930725\n",
            "[178/200]: loss_d: 1.2821130752563477, loss_g: 0.8888768553733826\n",
            "[179/200]: loss_d: 1.2854242324829102, loss_g: 0.8738650679588318\n",
            "[180/200]: loss_d: 1.2889792919158936, loss_g: 0.8678056001663208\n",
            "[181/200]: loss_d: 1.286665439605713, loss_g: 0.8751707077026367\n",
            "[182/200]: loss_d: 1.2912331819534302, loss_g: 0.871506929397583\n",
            "[183/200]: loss_d: 1.283664584159851, loss_g: 0.8793405890464783\n",
            "[184/200]: loss_d: 1.2867087125778198, loss_g: 0.8779704570770264\n",
            "[185/200]: loss_d: 1.2926558256149292, loss_g: 0.8710943460464478\n",
            "[186/200]: loss_d: 1.2882851362228394, loss_g: 0.8695812225341797\n",
            "[187/200]: loss_d: 1.287506341934204, loss_g: 0.8794741034507751\n",
            "[188/200]: loss_d: 1.2835124731063843, loss_g: 0.8805859088897705\n",
            "[189/200]: loss_d: 1.2889074087142944, loss_g: 0.8751445412635803\n",
            "[190/200]: loss_d: 1.2849284410476685, loss_g: 0.8771499395370483\n",
            "[191/200]: loss_d: 1.2846260070800781, loss_g: 0.8751053810119629\n",
            "[192/200]: loss_d: 1.2809141874313354, loss_g: 0.887861967086792\n",
            "[193/200]: loss_d: 1.2847001552581787, loss_g: 0.8722435235977173\n",
            "[194/200]: loss_d: 1.2857104539871216, loss_g: 0.8672556281089783\n",
            "[195/200]: loss_d: 1.2907683849334717, loss_g: 0.8694820404052734\n",
            "[196/200]: loss_d: 1.2909440994262695, loss_g: 0.8708098530769348\n",
            "[197/200]: loss_d: 1.2913293838500977, loss_g: 0.8724339008331299\n",
            "[198/200]: loss_d: 1.2882252931594849, loss_g: 0.8734105229377747\n",
            "[199/200]: loss_d: 1.2826027870178223, loss_g: 0.8834955096244812\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Generating Images from our Trained Generator Network"
      ],
      "metadata": {
        "id": "-7judlTOS247"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "with torch.no_grad():\n",
        "    test_z = torch.randn(8, z_dim).to(device)\n",
        "    generated = G(test_z)\n",
        "\n",
        "    save_image(generated.view(generated.size(0), 1, 28, 28), './track/sample_images_200' + '.png')"
      ],
      "metadata": {
        "id": "gxVOotx_oxeS"
      },
      "execution_count": 40,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "import matplotlib.pyplot as plt"
      ],
      "metadata": {
        "id": "fbhmXPVx-vgR"
      },
      "execution_count": 24,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "plt.imshow(generated.view(generated.size(0), 1, 28, 28).cpu()[1].permute(1,2,0))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 448
        },
        "id": "WpZVI2Snuihl",
        "outputId": "f221c3ef-f1a7-4eba-e4d1-11eca845f8a8"
      },
      "execution_count": 28,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.image.AxesImage at 0x7f5d605d4520>"
            ]
          },
          "metadata": {},
          "execution_count": 28
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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C2OOj3A4rB07dlz0x8fBgwd17NixtDo+nHNavny5Nm7cqK1bt6q0tDTm9ZkzZyorKyvmeGhubtaBAwfS6nj4tP3Qn927d0tSah0P1ndBfBYvv/yyCwaDbv369e7Xv/61u/fee92oUaNce3u7dWuD6tvf/rarr693ra2t7pe//KWrqKhw+fn57siRI9atJVVXV5fbtWuX27Vrl5PknnzySbdr1y734YcfOuec++EPf+hGjRrlNm/e7Pbs2eMWLFjgSktL3UcffWTceWKdbz90dXW5Bx980DU2NrrW1lb3zjvvuC9+8YvuqquucqdOnbJuPWGWLVvmQqGQq6+vd4cPH44uJ0+ejK5z3333ufHjx7utW7e6nTt3uvLycldeXm7YdeJ92n5oaWlx3/ve99zOnTtda2ur27x5s5s4caKbPXu2ceexhkQAOefcM88848aPH++ys7PdrFmz3Pbt261bGnS33XabKyoqctnZ2W7s2LHutttucy0tLdZtJd27777rJJ2zLF682Dl39lbsRx991BUUFLhgMOjmzp3rmpubbZtOgvPth5MnT7p58+a50aNHu6ysLDdhwgS3dOnStPshrb9/vyS3bt266DofffSR++Y3v+kuu+wyN3LkSHfLLbe4w4cP2zWdBJ+2Hw4cOOBmz57t8vLyXDAYdFdeeaX7zne+4zo7O20b/wTejgEAYCLlrwEBANITAQQAMEEAAQBMEEAAABMEEADABAEEADBBAAEATBBAAAATBBAAwAQBBAAwQQABAEwQQAAAE/8f0exWNHvz5DkAAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Plotting Losses from the Training"
      ],
      "metadata": {
        "id": "OEPmb8tlSyU2"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "plt.plot(range(1, len(losses)+1), [_[0] for _ in losses], label='discriminator_loss')\n",
        "plt.plot(range(1, len(losses)+1), [_[1] for _ in losses], label='generator_loss')\n",
        "plt.legend()\n",
        "plt.show()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 430
        },
        "id": "ylatKU9TSI1s",
        "outputId": "9fabb92e-19c6-43a5-8a73-df76ffe3ee27"
      },
      "execution_count": 43,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABn/ElEQVR4nO3dd3hUdd7+8fdMyqQnpAdI6L2LgIFVUVFERdBdK7vAitjAVVEexcfuT3F1raui+6hgw7YrsnYRDCpNuvQaQkuhpfeZ8/vjJJMMpLdJuV/XNddMzpw58zkZYG6+7VgMwzAQERERcROruwsQERGRtk1hRERERNxKYURERETcSmFERERE3EphRERERNxKYURERETcSmFERERE3EphRERERNzK090F1ITD4eDo0aMEBgZisVjcXY6IiIjUgGEYZGVl0b59e6zWyts/WkQYOXr0KLGxse4uQ0REROrg0KFDdOzYsdLnW0QYCQwMBMyTCQoKcnM1IiIiUhOZmZnExsY6v8cr0yLCSGnXTFBQkMKIiIhIC1PdEAsNYBURERG3UhgRERERt1IYEREREbdqEWNGRETaCrvdTlFRkbvLEKkRDw8PPD09673shsKIiEgzkZ2dzeHDhzEMw92liNSYn58fMTExeHt71/kYCiMiIs2A3W7n8OHD+Pn5ERERoQUepdkzDIPCwkKOHTtGYmIiPXr0qHJhs6oojIiINANFRUUYhkFERAS+vr7uLkekRnx9ffHy8iIpKYnCwkJ8fHzqdBwNYBURaUbUIiItTV1bQ1yO0QB1iIiIiNSZwoiIiIi4lcKIiIg0uNGjR3P33XcD0LlzZ1566aVGe6/HHnuMwYMH1+sYBw4cwGKxsGnTpgapqam19PoVRkREpFGtXbuWW265pdGOf99997F06dJ6HSM2Npbk5GT69+/fQFWZGjuItRaaTVOZPUsg7xQMvNbdlYiItGgRERGNclzDMLDb7QQEBBAQEFCvY3l4eBAdHd1AlTW8wsLCeq3j0dypZaQy/54Gn98COSfcXYmItEGGYZBbWOyWW20XXcvJyWHy5MkEBAQQExPD888/7/J8+dYBwzB47LHHiIuLw2az0b59e/72t7859y0oKOD+++8nNjYWm81G9+7defvttwFISEjAYrHw7bffMnToUGw2G7/++usZ3TRTp05l4sSJPP3000RFRRESEsITTzxBcXExs2fPJjQ0lI4dOzJ//nzna07v5ih9r6VLl3L22Wfj5+fHyJEj2bVrl/M1+/btY8KECURFRREQEMCwYcP48ccfnc+PHj2apKQk7rnnHiwWi8tMqf/85z/069cPm81G586dK/ydPfnkk0yePJmgoKA6tSwtX76c4cOHY7PZiImJ4YEHHqC4uNj5/L///W8GDBiAr68vYWFhjBkzhpycHOf5Dx8+HH9/f0JCQhg1ahRJSUm1rqGm1DJSEcOAggzzcUEG+Ie5tx4RaXPyiuz0feR7t7z39ifG4udd86+H2bNns3z5chYvXkxkZCQPPvggGzZsqHAcx3/+8x9efPFFPv74Y/r160dKSgqbN292Pj958mRWrVrFK6+8wqBBg0hMTOT48eMux3jggQf4xz/+QdeuXWnXrh0JCQlnvM+yZcvo2LEjP//8MytWrGDatGmsXLmS8847jzVr1vDJJ59w6623cvHFF9OxY8dKz+1///d/ef7554mIiOC2227jpptuYsWKFYC5Yu5ll13GU089hc1m47333mP8+PHs2rWLuLg4Pv/8cwYNGsQtt9zC9OnTncdcv3491157LY899hjXXXcdK1eu5I477iAsLIypU6c69/vHP/7BI488wqOPPlrDT6LMkSNHuOyyy5g6dSrvvfceO3fuZPr06fj4+PDYY4+RnJzMDTfcwLPPPstVV11FVlYWv/zyC4ZhUFxczMSJE5k+fTofffQRhYWF/Pbbb4067VxhpCKOsuRIcYH76hARaeays7N5++23+eCDD7jooosAePfddyv9gj948CDR0dGMGTMGLy8v4uLiGD58OAC7d+/m008/ZcmSJYwZMwaArl27nnGMJ554gosvvrjKukJDQ3nllVewWq306tWLZ599ltzcXB588EEA5syZwzPPPMOvv/7K9ddfX+lxnnrqKc4//3zADEGXX345+fn5+Pj4MGjQIAYNGuTc98knn2TRokX897//ZebMmYSGhuLh4UFgYKBLF9ALL7zARRddxMMPPwxAz5492b59O88995xLGLnwwgu59957qzzPyrz++uvExsby6quvYrFY6N27N0ePHuX+++/nkUceITk5meLiYq6++mo6deoEwIABAwA4efIkGRkZXHHFFXTr1g2APn361KmOmlIYqYi93EWqFEZExA18vTzY/sRYt713Te3b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EhKcr1+wYAEhISF8//339OnTh4CAAC699FKSk5Nd3uett96iT58++Pj40Lt3b15//XXncwcOHMBisfDJJ59w/vnn4+Pjw4cffsiJEye44YYb6NChA35+fgwYMICPPvrI+bqpU6eyfPlyXn75Zed6WAcOHABg+fLlDB8+HJvNRkxMDA888ADFxWUt56NHj2bmzJncfffdhIeHM3bs2Fr93sAch3nhhRfi6+tLWFgYt9xyC9nZ2c7nExISGD58OP7+/oSEhDBq1CiSkpIA2Lx5MxdccAGBgYEEBQUxdOhQ1q1bV+samoNaddOkpaUxefJkkpOTCQ4OZuDAgXz//fdcfPHFABw8eBCrtSzfnDp1iunTp5OSkkK7du0YOnQoK1eurHTAa5PLPAqFuRAYDbaAsu0u64wo6YqIGxTlwtPt3fPeDx4Fb/8a7z5r1ixWrFjBf//7X6KionjkkUfYsGEDgwcPBmDmzJls376djz/+mPbt27No0SIuvfRStmzZQo8ePQDIzc3lH//4B++//z5Wq5U///nP3HfffXz44YcAfPjhhzzyyCO8+uqrDBkyhI0bNzJ9+nT8/f2ZMmWKs5YHHniA559/niFDhuDj40N+fj5Dhw7l/vvvJygoiK+//pq//OUvdOvWjeHDh/Pyyy+ze/du+vfvzxNPPAFAREQER44c4bLLLmPq1Km899577Ny5k+nTp+Pj48Njjz3mfL93332X22+/nRUrVtT615yTk8PYsWOJj49n7dq1pKWlcfPNNzNz5kwWLFhAcXExEydOZPr06Xz00UcUFhby22+/OdfrmjRpEkOGDGHevHl4eHiwadMmvLy8al1Hc1CrMPL2229X+Xz5pAvw4osv8uKLL9a6qCbzyV/gyDq44WPoVe5CQxozIiJSI1lZWbz77rssXLiQiy66CID58+fTvr0ZpA4ePMj8+fM5ePCgc9t9993Hd999x/z583n66acBs0vljTfeoFu3boAZYErDAcCjjz7K888/z9VXXw1Aly5d2L59O2+++aZLGLn77rud+5S67777nI/vvPNOvv/+ez799FOGDx9OcHAw3t7e+Pn5uayJ9frrrxMbG8urr76KxWKhd+/eHD16lPvvv59HHnnE+R/vHj168Oyzz9bpd7dw4ULy8/N577338Pc3w9+rr77K+PHj+fvf/46XlxcZGRlcccUVzt9Lnz59nK8/ePAgs2fPpnfv3s5aWqq2fW0aa8nplw8foDEjIuJ+Xn5mC4W73ruG9u/fT1FREcOHD3duCw4OplevXoDZDWG32+nZs6fL6woKCggLC3P+7Ofn5/zCBYiJiSEtLQ0wWxD27dvHtGnTmD59unOf4uJigoODXY579tlnu/xst9t5+umn+fTTTzly5AiFhYUUFBTg51f1Oe7YsYP4+HiXVcNHjRpFdnY2hw8fJi4uDjAnctTVjh07GDRokDOIlL6Hw+Fg165dnHfeeUydOpWxY8dy8cUXM2bMGK699lrnuMtZs2Zx88038/777zNmzBiuueYal99hS6IwAq7hAzRmRETcz2KpVVdJc5WdnY2Hhwfr16/Hw8PD5bmAgLLu8dO7FywWC0bJ2JXSMRT/93//x4gRI1z2O/2Y5b/YAZ577jlefvllXnrpJQYMGIC/vz933313gw02Pf39Gtr8+fP529/+xnfffccnn3zCQw89xJIlSzjnnHN47LHHuPHGG/n666/59ttvefTRR/n444+56qqrGrWmxlDv2TQtmrXkD7HD7rrdZQVWjRkREalM165d8fLyYu3atc5tGRkZ7N69G4AhQ4Zgt9tJS0uje/fuLreaXiokKiqK9u3bs3///jOO0aVLlypfu2LFCiZMmMCf//xnBg0aRNeuXZ21lfL29sZud/0e6NOnD6tWrXIGotJjBQYG0rFjxxrVXZ0+ffqwefNmcnJyXN7DarU6W5bA/B3OmTOHlStX0r9/fxYuXOh8rmfPntxzzz388MMPXH311cyfP79BamtqbTuMeJQk8dO7adQyIiJSI4GBgUyZMoXZs2fz008/sW3bNqZNm4bVasVisdCzZ08mTZrE5MmT+fzzz0lMTOS3335j7ty5fP311zV+n8cff5y5c+fyyiuvsHv3brZs2cL8+fN54YUXqnxdjx49WLJkCStXrmTHjh3ceuutpKamuuzTuXNn1qxZw4EDBzh+/DgOh4M77riDQ4cOceedd7Jz504WL17Mo48+yqxZs1wmatTHpEmT8PHxYcqUKWzdupWffvqJO++8k7/85S9ERUWRmJjInDlzWLVqFUlJSfzwww/s2bOHPn36kJeXx8yZM0lISCApKYkVK1awdu1alzElLYm6aUBjRkRE6uGFF17gtttu44orriAoKIj/+Z//4dChQ/j4+ABmV8P/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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "oICcnSSvSPUD"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}